function OUT = my_pickpixel(MASK,NUM)
% OUT = my_pickpixel(MASK,NUM)
%
% --------自定义函数--------
% 函数名称：my_pickpixel
% 函数说明：在输入的地图中相对均匀抽样选点，返回坐标对组成的列向量
% 函数输入：
%   MASK：mask掩膜，数据有效性的二维空间矩阵，要求以nan为无效数据的标签。
%   NUM：随机选取栅格的数量。
% 函数输出：
%   OUT：[x1,y1;x2,y2;...]
% 作者：sid
% LOG：
%    2021/10/24 ver 0.1: create
%    2021/10/26 ver 1.0: 更新了生成坐标机制，能够筛选掉边界上的点
%                        能够通过函数递归，将在nan区内的点重新选择坐标
%    2021/11/10 ver 1.1: update, 如果mask没有正确设置，而是使用了默认
%                        的[0,1]格式，那么就自动修改成带nan的格式。

% 检查mask是否是以nan为无效数据标签，如果不是，则自动修改
if ~any(isnan(MASK),'all')
    MASK = double(MASK);
    MASK(MASK == 0 )=nan;
end

OUT = zeros(NUM,2);

% 通过矩阵运算，得到所有点的坐标对，第一列是行号，第二列是列号
OUT = generate_XY(MASK,OUT);
end


function output = generate_XY(mask,input)
    % 嵌套函数。生成坐标点对
    % 输入：
    %   mask： 掩膜，二维空间矩阵，无效为nan
    %   input： n*2 矩阵，点的坐标对，第一列是行号，第二列是列号
    % 输出：
    %   output： 同input
    SIZE = size(mask);
    
    output = rand_generate(input);
    % 找到其中不在MASK数据有效性区域内的点
    ind = sub2ind(SIZE,output(:,1),output(:,2));
    Unvalid_index =  isnan(mask(ind));
    if any(Unvalid_index)
        sub_input = output(Unvalid_index,:);
        output(Unvalid_index,:) = generate_XY(mask,sub_input);
    end
    
    function out = rand_generate(input)
        % 
        % 产生xy坐标，如果出现在边界上就重新生成。
        randx = rand(size(input));
        SizeInput = size(randx);
        out = round(randx .* repmat(SIZE,SizeInput(1),1));
        if any(out == SIZE(1),'all') || any(out == SIZE(2),'all') ||...
                any(out == 0,'all')
            out = rand_generate(input);
        end 
    end
end
